/**
 * @file example_001.c
 * @author yangjian (1171267147@qq.com)
 * @brief fork实验，测试父子进程是否共享堆内存
 * @version 0.1
 * @date 2025-07-11
 *
 * @copyright Copyright (c) 2025
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/random.h>
#include <time.h>
#include <unistd.h>

int main() {
    int *arr = (int *)malloc(sizeof(int) * 10);

    srand(time(NULL));

    // 仅父进程执行
    // ?在wsl环境下，使用CodeRunner执行，下面这段输出了两次，且均由父进程执行；在终端中执行，只输出了一次
    for (int i = 0; i < 10; i++) {
        arr[i] = rand();
        printf("%d--", arr[i]);
    }
    printf("%d\n", getpid());

    int pid = fork();

    // arr地址相同，但是输出完全不同，说明父子进程的内存空间(包含堆内存)是独立的，虚拟地址相同，但是对应不同的物理地址
    if (pid == 0) {
        printf("子进程：%d\n", getpid());
        printf("arr = %p\n", arr);
        for (int i = 0; i < 10; i++) {
            arr[i] = rand();
        }
        for (int i = 0; i < 10; i++) {
            printf("%d ", arr[i]);
        }
        free(arr);
    } else if (pid > 0) {
        printf("父进程：%d\n", getpid());
        printf("arr = %p\n", arr);
        for (int i = 0; i < 10; i++) {
            printf("%d ", arr[i]);
        }
        free(arr);
    }

    return 0;
}